package com.zwim.core.message;

import com.zwim.common.ObjectSerializerUtils;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;

import java.util.List;

/**
 *编解码器
 * 把消息提转换为其他消息体
 */
public class ObjectCodec extends MessageToMessageCodec<ByteBuf, Object> {

    /**
     * 将字节解码为消息
     * 将消息体序列化为2进制字节对象
     * @param ctx 通道上下文
     * @param msg 消息对象
     * @param out 出站信息
     */
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) {
        byte[] data = ObjectSerializerUtils.serilizer(msg);
        ByteBuf buf = Unpooled.buffer();
        buf.writeBytes(data);
        out.add(buf);
    }

    /**
     * 字节反序列化
     * @param ctx 通道上下文
     * @param msg 字节流
     * @param in 入站信息流
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> in) {
        byte[] bytes = new byte[msg.readableBytes()];
        msg.readBytes(bytes);
        Object deSerilizer = ObjectSerializerUtils.deSerilizer(bytes);
        in.add(deSerilizer);
    }
}
